package com.byd.dms.sf_json.service;


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.byd.dms.sf_json.entity.People;
import com.byd.dms.sf_json.entity.PeopleJson;
import com.byd.dms.sf_json.entity.Role;
import com.byd.dms.sf_json.entity.RoleJson;
import org.springframework.stereotype.Service;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
//import org.springframework.transaction.annotation.Transactional;

/**
 * @Description: https://www.cnblogs.com/x-ll123/p/9352175.html
 * @date 2018年7月21日, 上午12:27:32
 */
@Service
//@Transactional
public class JsonDemoServiceImpl implements JsonDemoService {
    
    /**
     * @param @return
     * @param @throws Exception
     * @throws
     * @Description: 排序后打印出json规定格式
     */
    @Override
    public JSONObject jsonSort(int roleCount, int peopleCount, int markCount) throws Exception {
        List<Role> roleList = SimulationData.dataRole(roleCount);
        List<People> peopleList = SimulationData.dataPeople(peopleCount, markCount);
        JSONObject returnJson = jsonStudy(peopleList, roleList);
        return returnJson;
    }
    
    /**
     * @param @param  peopleList
     * @param @param  userList
     * @param @return
     * @return JSONObject
     * @throws
     * @Description: 实战使用, 根据mark找People的相关Role且使用Json格式打印(可排序也可不排序)
     * 重点：学习JSONObject与JSONArray的使用（Json转对象，对象转Json）
     */
    private JSONObject jsonStudy(List<People> peopleList, List<Role> roleList) {
        long start = System.currentTimeMillis();
        JSONObject returnJson = new JSONObject();
        JSONArray peopleJsonArray = new JSONArray();
        for (People people : peopleList) {
            //每个人的标记集合
            Set<String> markSet = people.getMarkSet();
            JSONObject propleJson = new JSONObject();
            propleJson.put("description", "People数据信息如下：");
            propleJson.put("message", people.getMessage());
            JSONArray roleJsonArray = new JSONArray();
            /**匹配每个人扮演的角色*/
            for (String mark : markSet) {
                for (Role role : roleList) {
                    if (mark.equals(role.getMark())) {
                        JSONObject userDataJson = JSONObject.fromObject(role);
                        userDataJson.put("description", "添加的属性字段信息" + mark);
                        roleJsonArray.add(userDataJson);
                    }
                }
            }
            /**把JSONArray(roleJsonArray)转换为List对象*/
            if (roleJsonArray.size() > 0) {
                List<RoleJson> roleJonList = new ArrayList<RoleJson>();
                for (int i = 0; i < roleJsonArray.size(); i++) {
                    JSONObject roleJson = (JSONObject) roleJsonArray.get(i);
                    RoleJson roleJsonDate = new RoleJson();
                    roleJsonDate = (RoleJson) JSONObject.toBean(roleJson, RoleJson.class);
                    roleJonList.add(roleJsonDate);
                }
                /**根据唯一标记(mark)进行角色排序*/
                Collections.sort(roleJonList, new Comparator<RoleJson>() {
                    public int compare(RoleJson R1, RoleJson R2) {
                        return (R1.getMark()).compareTo(R2.getMark());
                    }
                });
                propleJson.put("roleJonList", roleJonList);
                peopleJsonArray.add(propleJson);
            }
        }
        /**多个人根据第一个标记进行排序输出*/
        if (peopleJsonArray.size() > 0) {
            List<PeopleJson> peopleJsonList = new ArrayList<PeopleJson>();
            /**JSONArray(peopleDataJsonArray)转换为Map对象*/
            for (int i = 0; i < peopleJsonArray.size(); i++) {
                JSONObject pJsonObject = (JSONObject) peopleJsonArray.get(i);
                PeopleJson peopleJson = new PeopleJson();
                Map<String, Class<RoleJson>> map = new HashMap<String, Class<RoleJson>>();
                map.put("roleJonList", RoleJson.class);
                peopleJson = (PeopleJson) JSONObject.toBean(pJsonObject, PeopleJson.class, map);
                peopleJsonList.add(peopleJson);
            }
            /**排序*/
            Collections.sort(peopleJsonList, new Comparator<PeopleJson>() {
                public int compare(PeopleJson R1, PeopleJson R2) {
                    return R1.getRoleJonList().get(0).getMark().compareTo(R2.getRoleJonList().get(0).getMark());
                }
            });
            peopleJsonArray.add(peopleJsonList);
            returnJson.put("peopleJsonArray", peopleJsonList);
        }
        long end = System.currentTimeMillis();
        System.out.println("处理数据时间：" + (end - start));
        return returnJson;
    }
    
}